package com.xiaoniu.forum.web.controller.app;


import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.xiaoniu.forum.common.utils.PageUtils;
import com.xiaoniu.forum.common.utils.R;
import com.xiaoniu.forum.entity.BannerEntity;
import com.xiaoniu.forum.entity.CommunityTopicEntity;
import com.xiaoniu.forum.entity.vo.AppBaseUserVo;
import com.xiaoniu.forum.entity.vo.AppCommunityTopicVo;
import com.xiaoniu.forum.service.BannerService;
import com.xiaoniu.forum.service.IndexService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;


import java.util.List;




/**
 * 前台首页控制器
 *
 * @author xiaoniu
 * @email 55333@qq.com
 * @date 2021-03-17 10:26:48
 */
@RestController
@RequestMapping("/app/index")
@Api("首页API")
public class AppIndexController {
    @Autowired
    private IndexService indexService;

    /**
     * 轮播图列表
     */
    @GetMapping("/banner/list")
    @ApiOperation("轮播图列表")
    public R list(){
        List<BannerEntity> banners = indexService.listBanner(10);
        return R.ok().put("data",banners);
    }


    /***
     * 热门帖子的列表
     * 热门帖子：按帖子的浏览+评论数算出综合分，取靠分数较高的记录
     *
     * 问题：数据如何缓存？如何保证缓存中数据和mysql保持一致
     *      缓存：
     *          取出热门帖子，缓存到Redis中
     *      数据一致性：
     *          保证数据一致性太消耗服务器的资源，所以可以将缓存的有效期设置短一点，比如一分钟
     *          帖子的内容可以容忍短暂的数据不一致，只要保证最终一致性即可
     */
    @GetMapping("/hotTopic/list/{currentPage}")
    @ApiOperation("热门帖子列表")
    public R hotTopicList(@PathVariable("currentPage") Long current){
        if (current>5){//热门帖子最多50条
            return  R.error();
        }
        List<AppCommunityTopicVo> topics = indexService.hotTopicList(current, 10L);
        return R.ok().put("list",topics);
    }


    /**
     * 粉丝较多的用户列表
     *  问题：数据如何缓存？如何保证缓存中数据和mysql保持一致
     *
     *     缓存：
     *          取出粉丝较多的用户，缓存到Redis中
     *     数据一致性：
     *          用户的信息，如：头像、昵称、个性签名等等，可以保存与Mysql的数据一致，因为这些也不是经常变化
     *              也就是缓存中存在的用户，当他更新个人资料时，就需要将他缓存中的数据清除
     *
     *          用户的关注数、粉丝数等：
     *               这一类信息经常变化，而且对一致性要求并不高
     *
     *       所以：
     *             将缓存时间设置短一点，同时当缓存中存在的用户更新数据时，刷新
     */
     //TODO 目前暂时选择将缓存时间设置短一点，以后有时间再改
    @GetMapping("/hotUser/list/{currentPage}")
    @ApiOperation("热门用户列表")
    public R hotUserList(@PathVariable("currentPage") Long current){
        if (current>5){//热门用户最多50条
            return  R.error();
        }
        List<AppBaseUserVo> baseUsers = indexService.hotUserList(current,10L);
        return R.ok().put("list",baseUsers);
    }
}
